//柯里化（currying）指的是将一个多参数的函数拆分成一系列函数，每个拆分后的函数都只接受一个参数（unary）。

//TODO:暴力版
function add2 (a) {
    return function (b) {
        return function (c) {
            return a + b + c;
        }
    }
}
console.log(add2(1)(2)(3)); // 6


// TODO:多参数的不定长度
function add (...args) {
    //求和
    return args.reduce((a, b) => a + b)
}

function currying (fn) {
    let args = []
    return function temp (...newArgs) {
        if (newArgs.length) {
            args = [
                ...args,
                ...newArgs
            ]
            return temp
        } else {
            let val = fn.apply(this, args)
            args = [] //保证再次调用时清空
            return val
        }
    }
}

let addCurry = currying(add)
console.log(addCurry(1,2,3)(2)())
// console.log(addCurry(1)(2)(3)(4, 5)())  //15
// console.log(addCurry(1)(2)(3, 4, 5)())  //15
// console.log(addCurry(1)(2, 3, 4, 5)())  //15
